package com.situ.javase.day12;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.function.Function;

import org.junit.Test;

public class ExceptionDemo {
	
	public static void main1(String[] args) {
		Student student = new Student(1, "张三", 10000.0);
		String name = student.getName();
		student = null;
		// null.操作调用任何的属性或者方法：就会报空指针异常NullPointerException
		String name2 = student.getName();
	}
	
	public static void main11(String[] args) {
		// 运行时异常（RuntimeExceptin）只有在程序运行的时候才可能出现异常
		//java.lang.ArithmeticException: / by zero
		int i = 0;
		System.out.println(23 / i);
		
		// 编译时异常，在写代码编译时候就需要处理这个异常，不处理就会一直报错
		// Unhandled exception type InterruptedException
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		// 编译时异常，就类似于未雨绸缪，认为这个文件因为硬盘坏了或者不小心删除：找不到
		try {
			FileInputStream fileInputStream = new FileInputStream(new File(""));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void test43() {
		Person person = new Student();;
		// java.lang.ClassCastException: com.situ.javase.day12.Student
		// cannot be cast to com.situ.javase.day12.Teacher
		// 父类赋给子类需要强制类型转换
		Teacher teacher = (Teacher) person;
	}
	
	public static void main55(String[] args) {
		int num1 = 6;
		int num2 = 0;
		System.out.println("------start-------");
		try {
			int result = num1 / num2;
		} catch (ArithmeticException e) {
			// 捕获异常之后可以处理异常，程序也不会崩溃，后面代码可以继续执行
			System.out.println("catch.ArithmeticException");
			e.printStackTrace();
		} finally {
			// 一定会被执行的代码(不管异常抛不抛出都会执行，例如数据库释放连接)
			System.out.println("--------finally-------");
		}
		System.out.println("------end-------");
	}
	
	
	public static void main888(String[] args) {
		try {
			FileInputStream fileInputStream = 
					new FileInputStream("a.txt");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static void main444(String[] args) {
		// 对于编译时异常FileNotFoundException在fun函数里面没有处理
		// 将这个异常抛出了，在调用方也有两种方式：1、我也不想处理，继续抛出。
		// 2、try-catch捕获这个异常
		try {
			fun();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	// 不处理异常，而是将异常抛出
	private static void fun() throws FileNotFoundException {
		FileInputStream fileInputStream = 
				new FileInputStream("a.txt");
	}
	
	public static void main77(String[] args) {
		try {
			FileInputStream fileInputStream = 
					new FileInputStream("a.txt");
			Thread.sleep(50);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (Exception e) {
			// 尽量不要用所有异常的父类来处理所有的异常情况
			// 应该去捕获具体的异常，除非实在找不到这个问题了可以使用
			// 保证程序先不崩溃，后面可以再去找具体的错误
			e.printStackTrace();
		}
		System.out.println("-------end---------");
	}
	
	public static void main556(String[] args) {
		try {
			function();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

	private static void function() throws IllegalAccessException {
		System.out.println("ExceptionDemo.function()");
		// ....
		// 如果出现一些非法访问的情况，认为是一种严重的错误，我们主动抛出异常
		throw new IllegalAccessException("非法访问");
	}
	
	public static void main(String[] args) {
		MoneyManager moneyManager = new MoneyManager(1000.0, "001");
		moneyManager.deposite(500);
		try {
			moneyManager.withdraw(600);
		} catch (MyException e1) {
			e1.printStackTrace();
		}
		
		try {
			moneyManager.withdraw(1000);
		} catch (MyException e) {
			e.printStackTrace();
			// 在界面上给用户弹出一个提示，显示余额不足
			double money = e.getMoney();
			System.out.println("还需要" + money);
		}
		System.out.println("-------end--------");
	}
	
}
